Java 与linkedin v2 api的图像共享未在页面提要上发布

Java 与linkedin v2 api的图像共享未在页面提要上发布,java,curl,httprequest,linkedin-api,Java,Curl,Httprequest,Linkedin Api,好吧,这就是我的问题。。要通过linkedin api共享图像帖子,首先必须注册图像文件,然后通过发送二进制文件的post请求进行注册。然后您使用原始请求中的图像URN来提交您的帖子。我的请求通过,返回201代码(这应该是一个成功的请求),但最终没有发布图像或文本。如果我试着只发布文本,它会起作用。我尝试使用curl注册我的图像,并将其发布在linkedin上,因此我认为我没有在请求中正确发送二进制文件,这是我的请求: HttpClient client = HttpCl

好吧,这就是我的问题。。要通过linkedin api共享图像帖子,首先必须注册图像文件,然后通过发送二进制文件的post请求进行注册。然后您使用原始请求中的图像URN来提交您的帖子。我的请求通过,返回201代码(这应该是一个成功的请求),但最终没有发布图像或文本。如果我试着只发布文本,它会起作用。我尝试使用curl注册我的图像,并将其发布在linkedin上,因此我认为我没有在请求中正确发送二进制文件,这是我的请求:

            HttpClient client = HttpClientBuilder.create().build();
            HttpPut request = new HttpPut(uploadUrl);
            request.addHeader("Content-Type", "data/binary");
            request.setHeader("X-Restli-Protocol-Version", "2.0.0");
            request.setHeader("Authorization", "Bearer " + myToken);

            File file = new File(pictureUrl);

            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            builder.addBinaryBody("upload-file", file);
            request.setEntity(builder.build());
            HttpResponse response = client.execute(request);
我用这个代码得到了代码201,但它仍然没有发布。 这是他们给出的请求的示例

你能告诉我我的java等价物有什么问题吗

编辑:忘了说我甚至试过从java调用curl,这与我在终端中使用的代码相同,但仍然不起作用

        Process p;
        try {
            p = Runtime.getRuntime().exec("curl -i --upload-file" + " " + pictureUrl + " " + "--header \"Authorization: Bearer " + myToken + "\" '" + uploadUrl + "'");
            p.waitFor();
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

            String line = "";
            String outputController = "";
            while ((line = reader.readLine()) != null) {
                outputController = outputController + '\n' + line;
            }
            System.out.println("out: ");
            System.out.println(outputController);
            return true;
        } catch (IOException | InterruptedException ex) {
            return false;
        }
输出返回一个空字符串


Edit2:另一件有趣的事,当我执行主请求时,我发送了文本和提交图像后得到的媒体骨灰盒,我再次得到201,就像它成功了一样,在响应中我甚至得到了帖子id。然后我尝试使用另一个api端点,并使用从响应中获得的id提取帖子,我得到了所有数据,就像贴的帖子一样。它甚至在json中说,我得到的生命周期已经发布,媒体的状态已经就绪。唯一不同于linkedin上的json图像帖子的是,媒体对象有缩略图,而在本例中没有缩略图,它只是一个空json数组。

不熟悉Java,但是我在使用Ruby时遇到了同样的问题,我通过在请求头中添加我上传的图像的MIME类型作为内容类型来解决了这个问题。因此,在您的具体情况下,它将是:

request.addHeader("Content-Type", "image/png");

再看看我使用Ruby的RestClient和Minimagick的解决方案:

好的,我已经解决了,如果有人遇到同样的问题,这就是我做错的地方。在请求中,我在请求体中添加了一个多部分,这是错误的,您只需进行原始处理。所以不是

    File file = new File(pictureUrl);
    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    builder.addBinaryBody("upload-file", file);
    request.setEntity(builder.build());
你只是把

request.setEntity(new FileEntity(new File(pictureUrl), ContentType.create(picture.getContentType())));
然后一切正常。

我找到了旋度到C的转换器 下面是生成的代码段:



    using (var httpClient = new HttpClient())
    {
        using (var request = new HttpRequestMessage(new HttpMethod("PUT"), "https://api.linkedin.com/mediaUpload/C5522AQGTYER3k3ByHQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJbrN86Zm265gAAAWemyz2pxPSgONtBiZdchrgG872QltnfYjnMdb2j3A&app=1953784&sync=0&v=beta&ut=2H-IhpbfXrRow1"))
        {
            request.Headers.TryAddWithoutValidation("Authorization", "Bearer redacted"); 

            request.Content = new ByteArrayContent(File.ReadAllBytes("/test.png")); 

            var response = await httpClient.SendAsync(request);
        }
    }


我与kotlin一起写作,在与同一问题斗争了很长一段时间后,我设法解决了它,对于那些与类似问题斗争的人,我将在下面留下我的示例代码。对于可视化,您需要提供一个直接的URI路径,还需要注意头结构

这是密码

var file = File(ImageURI)
    val urls = URL(url)
    var connection: HttpsURLConnection = urls.openConnection() as HttpsURLConnection
    connection.setRequestProperty("Authorization","Bearer " + accesToken)
    connection.setRequestProperty("Content-Type", "image/png")
    connection.setRequestProperty("cache-control", "no-cache")
    connection.setRequestProperty("X-Restli-Protocol-Version", "2.0.0")
    connection.requestMethod = "POST"
    connection.doOutput = true
    connection.doInput = true

    var request = DataOutputStream(connection.outputStream)
    request.write(file.readBytes())
    request.flush()

    println("Response: "+connection.responseCode)

顺便问一下,你的资产状况如何?是“CLIENT_ERROR”吗?我已经尝试将内容类型更改为图像mime类型,但仍然没有成功。您在哪里可以看到资产的状态?您可以向{asset_ID}发出GET请求。从registerUpload调用返回资产id。P.S.资产id,不是骨灰盒,即获取是的。。。我得到“CLIENT_ERROR”那么下一步该怎么办(共享帖子),它需要请求正文中的用户id,但我无法在后端获得它(错误500)。如果您使用的是you not require user id,则需要在author字段中使用您的urn。URN的构造如下:“URN:{namespace}:{entityType}:{id}”。名称空间始终为“li”,实体类型可以是“组织/个人/赞助商帐户”,以及调用时获得的id。我使用我的页面共享帖子,所以我的urn是urn:li:organization:myCustomId
var file = File(ImageURI)
    val urls = URL(url)
    var connection: HttpsURLConnection = urls.openConnection() as HttpsURLConnection
    connection.setRequestProperty("Authorization","Bearer " + accesToken)
    connection.setRequestProperty("Content-Type", "image/png")
    connection.setRequestProperty("cache-control", "no-cache")
    connection.setRequestProperty("X-Restli-Protocol-Version", "2.0.0")
    connection.requestMethod = "POST"
    connection.doOutput = true
    connection.doInput = true

    var request = DataOutputStream(connection.outputStream)
    request.write(file.readBytes())
    request.flush()

    println("Response: "+connection.responseCode)