无法使用 Java 中的 okHTTP multipart-form 数据为我的 android 应用重新创建 cURL POST 请求
Not able to recreate a cURL POST request using okHTTP multipart-form data in Java for my android app
我已经尝试了两天,以了解如何复制将图像添加到我的 Craftar 图像识别中的 curl 请求 collection。我能够创建一个项目,但是设置 multipart-data 代码的方法让我失败了。 Craftar 仅提供有关如何 Post 图像文件将其附加到 collection 项目的 cURL 语句。
我已经尝试使用 RequestB.in 和 Postman 来查看我在消息传输中可以看到的内容来弄清楚,但是 okHTTP 方法的组合似乎无法解决问题。我很难过。我已经尝试将 "image/png" 和 "application/octet-stream" 作为我的媒体类型。当我使用 Postman 向它发送测试请求时,RequestB.in 显示 "application/octet-stream"。以下是它显示的消息信息。
这是我试图用 Java 复制的 cURL 语句。
curl -X POST 'https://my.craftar.net/api/v0/image/api_key=123456789abcdefghijk123456789abcdefghijk' -F "item=/api/v0/item/d05924dde1784787a3d6b815e2b1cd69/" -F "file=@back_cover.jpg"
这是我的代码:
public class OkHttpHandler extends AsyncTask<String, Void, String> {
OkHttpClient client = new OkHttpClient();
@Override
protected String doInBackground(String... params) {
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File file = new File("/storage/emulated/0/Pictures/BlissBotSenderImages/kaytiandkristoffer.jpg");
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("item", "/api/v0/item/d05924dde1784787a3d6b815e2b1cd69/")
.addFormDataPart("file","kaytiandkristoffer.jpg",
(RequestBody.create (MEDIA_TYPE_PNG, file)))
.build();
Request request = new Request.Builder()
.url(postImageUrl)
.post(requestBody)
.build();
try {
Response response = client.newCall(request).execute();
return response.body().string();
} catch (Exception e) {
e.printStackTrace();
}
下面是 RequestB.in 成功 Post 来自 Postman 消息的详细信息:
FORM/POST 参数
项目:/api/v0/item/d05924dde1784787a3d6b815e2b1cd69/
HEADERS
Cf-Ray: 3cdba305fb509b62-DFW
通过:1.1 素食主义者
Cf-Visitor: {"scheme":"https"}
Content-Type: multipart/form-data;边界=a11df5d0-f007-4d3a-9849-18fe334c532c
Accept-Encoding: gzip
Content-Length: 3509853
Total-Route-Time: 0
Cf-Connecting-Ip: 2001:5b0:42c4:2ae8:2954:59ea:a3e8:4787
X-Request-Id:766063f7-c368-4467-b5ed-42776ac6f528
主持人:requestb.in
连接:关闭
Cf-Ipcountry:美国
User-Agent: okhttp/3.9.1
Connect-Time: 1
RAW BODY
--a11df5d0-f007-4d3a-9849-18fe334c532c
Content-Disposition: form-data;姓名="item"
Content-Length: 46
/api/v0/item/d05924dde1784787a3d6b815e2b1cd69/
--a11df5d0-f007-4d3a-9849-18fe334c532c
Content-Disposition: form-data;名字="file";文件名="kaytiandkristoffer.jpg"
Content-Type: application/octet-stream
Content-Length: 3509467
ÿØÿáExifII*
¦°¸(1
À2ÈiânSAMSUNGSPH-L720THHL720TVPUBNG52015:04:05 21:22:25\d"'20220l
¤
¬´
¼|bîÄ 0100 P¢£¤¤¤¤ ¤!ÌåÜd2015:04:05 21:22:252015:04:05 21:22:25ìäd2
äd¤dASCIINVMU^^;YgZHXgmGum{wsxÞ¾ï2ì2åÞ¾ïso|Þ¾ïÞ¾ïs|Þ¾ïUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU~Þ¾ïxt¡vuÞ¾ïCALCur|0xDD70utvp{vVigcjijHrimoaJi[pnLsEX
\?;I99:C9SHxVBS?@4
9?<>Þ¾ïTUNAIFJ"BFPMHERC=7->98'VNC-/=E7AD35IECLI:P[aBDVabVTiZZ:@HHG[EH[LZ8RLLn< 8a=FD"GONLNZTNGBQQLPGR_޾ﮮ®®Fèþ»)q5èêÈìµ×2þJ
+'#ÿê%:pF}-©}½-©.^2@E×û »'%('%$.!!$$#&*@Þ¾ï "# E-&3>-JR>GSnxfZcZ[U]R]]W^SOXM¨a~ziqkfeheUY[nzzvra~eh[Rh\belL[NGI>RNbddqmIAIEIGNRNAAD59<-4':ZD/#.BA8$$$@8JG\qgZ~{qmcy[\~rhttcio
xtne^y{{r~vmxr|rsweu{gw{iqs~ozgvy|xxffwnyyZk|WWyvt{|s}wz{zw~|vvxsjquxyykdv}jtp{}{ryY~vv}tqx{pgjsolzq~ftxrkug{|Sjqn|w]kwlq}mssij~r|||zn|}w|u{j~tmHztMvoBZlV
Gt[aUp]>? ,306A7$!BB13-
(60,!%6H@ELEB@6%KVJ@t;04 OFC4-
'#
$*71.;^M@IVTMF@L>dkL,:KE7<%$?MxIu ®crZs/Y7Z/DDS_WVRgT^VGPb^gTORN4%Lo |p«¼ÇÓÎÄÅÃô¬°¦qg?NOa\rl\T
N;XL"e5F=H=ASlOjTwd\dclSVXsnXXWYcG7B-XTK:cabfgfiitnW/)E28512*1M+4G@8/BC3,4 '<,12='/+-3%2,A()')&.+'6.&C?),1@/52$-%8;93(-+ ),,#.=+%**+'6("@'K
/, #!%+!("#&$,+($)!%88
!.-0&&$'!#+'&$(5/,) ;---0 5,2!+&"0/( &") $+<&( #$"+/&"# 9* #$&$"%"$$!!#&/0*( $$
('!$&"#.1&
有时问题出在其他地方。沿线的某处我不小心在端点地址中插入了一个无关的字符。我修复了这个问题,上面的代码可以正常工作。
我已经尝试了两天,以了解如何复制将图像添加到我的 Craftar 图像识别中的 curl 请求 collection。我能够创建一个项目,但是设置 multipart-data 代码的方法让我失败了。 Craftar 仅提供有关如何 Post 图像文件将其附加到 collection 项目的 cURL 语句。
我已经尝试使用 RequestB.in 和 Postman 来查看我在消息传输中可以看到的内容来弄清楚,但是 okHTTP 方法的组合似乎无法解决问题。我很难过。我已经尝试将 "image/png" 和 "application/octet-stream" 作为我的媒体类型。当我使用 Postman 向它发送测试请求时,RequestB.in 显示 "application/octet-stream"。以下是它显示的消息信息。
这是我试图用 Java 复制的 cURL 语句。
curl -X POST 'https://my.craftar.net/api/v0/image/api_key=123456789abcdefghijk123456789abcdefghijk' -F "item=/api/v0/item/d05924dde1784787a3d6b815e2b1cd69/" -F "file=@back_cover.jpg"
这是我的代码:
public class OkHttpHandler extends AsyncTask<String, Void, String> {
OkHttpClient client = new OkHttpClient();
@Override
protected String doInBackground(String... params) {
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File file = new File("/storage/emulated/0/Pictures/BlissBotSenderImages/kaytiandkristoffer.jpg");
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("item", "/api/v0/item/d05924dde1784787a3d6b815e2b1cd69/")
.addFormDataPart("file","kaytiandkristoffer.jpg",
(RequestBody.create (MEDIA_TYPE_PNG, file)))
.build();
Request request = new Request.Builder()
.url(postImageUrl)
.post(requestBody)
.build();
try {
Response response = client.newCall(request).execute();
return response.body().string();
} catch (Exception e) {
e.printStackTrace();
}
下面是 RequestB.in 成功 Post 来自 Postman 消息的详细信息:
FORM/POST 参数 项目:/api/v0/item/d05924dde1784787a3d6b815e2b1cd69/
HEADERS Cf-Ray: 3cdba305fb509b62-DFW
通过:1.1 素食主义者
Cf-Visitor: {"scheme":"https"}
Content-Type: multipart/form-data;边界=a11df5d0-f007-4d3a-9849-18fe334c532c
Accept-Encoding: gzip
Content-Length: 3509853
Total-Route-Time: 0
Cf-Connecting-Ip: 2001:5b0:42c4:2ae8:2954:59ea:a3e8:4787
X-Request-Id:766063f7-c368-4467-b5ed-42776ac6f528
主持人:requestb.in
连接:关闭
Cf-Ipcountry:美国
User-Agent: okhttp/3.9.1
Connect-Time: 1
RAW BODY --a11df5d0-f007-4d3a-9849-18fe334c532c Content-Disposition: form-data;姓名="item" Content-Length: 46
/api/v0/item/d05924dde1784787a3d6b815e2b1cd69/ --a11df5d0-f007-4d3a-9849-18fe334c532c Content-Disposition: form-data;名字="file";文件名="kaytiandkristoffer.jpg" Content-Type: application/octet-stream Content-Length: 3509467
ÿØÿáExifII*
¦°¸(1
À2ÈiânSAMSUNGSPH-L720THHL720TVPUBNG52015:04:05 21:22:25\d"'20220l
¤
¬´
¼|bîÄ 0100 P¢£¤¤¤¤ ¤!ÌåÜd2015:04:05 21:22:252015:04:05 21:22:25ìäd2
äd¤dASCIINVMU^^;YgZHXgmGum{wsxÞ¾ï2ì2åÞ¾ïso|Þ¾ïÞ¾ïs|Þ¾ïUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU~Þ¾ïxt¡vuÞ¾ïCALCur|0xDD70utvp{vVigcjijHrimoaJi[pnLsEX
\?;I99:C9SHxVBS?@4
9?<>Þ¾ïTUNAIFJ"BFPMHERC=7->98'VNC-/=E7AD35IECLI:P[aBDVabVTiZZ:@HHG[EH[LZ8RLLn< 8a=FD"GONLNZTNGBQQLPGR_޾ﮮ®®Fèþ»)q5èêÈìµ×2þJ
+'#ÿê%:pF}-©}½-©.^2@E×û »'%('%$.!!$$#&*@Þ¾ï "# E-&3>-JR>GSnxfZcZ[U]R]]W^SOXM¨a~ziqkfeheUY[nzzvra~eh[Rh\belL[NGI>RNbddqmIAIEIGNRNAAD59<-4':ZD/#.BA8$$$@8JG\qgZ~{qmcy[\~rhttcio
xtne^y{{r~vmxr|rsweu{gw{iqs~ozgvy|xxffwnyyZk|WWyvt{|s}wz{zw~|vvxsjquxyykdv}jtp{}{ryY~vv}tqx{pgjsolzq~ftxrkug{|Sjqn|w]kwlq}mssij~r|||zn|}w|u{j~tmHztMvoBZlV
Gt[aUp]>? ,306A7$!BB13-
(60,!%6H@ELEB@6%KVJ@t;04 OFC4-
'#
$*71.;^M@IVTMF@L>dkL,:KE7<%$?MxIu ®crZs/Y7Z/DDS_WVRgT^VGPb^gTORN4%Lo |p«¼ÇÓÎÄÅÃô¬°¦qg?NOa\rl\T
N;XL"e5F=H=ASlOjTwd\dclSVXsnXXWYcG7B-XTK:cabfgfiitnW/)E28512*1M+4G@8/BC3,4 '<,12='/+-3%2,A()')&.+'6.&C?),1@/52$-%8;93(-+ ),,#.=+%**+'6("@'K
/, #!%+!("#&$,+($)!%88
!.-0&&$'!#+'&$(5/,) ;---0 5,2!+&"0/( &") $+<&( #$"+/&"# 9* #$&$"%"$$!!#&/0*( $$
('!$&"#.1&
有时问题出在其他地方。沿线的某处我不小心在端点地址中插入了一个无关的字符。我修复了这个问题,上面的代码可以正常工作。